package cn.yiyuan.base.config.exception;

import cn.yiyuan.base.customCode.ResponseCode;
import cn.yiyuan.base.until.AjaxResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;


/**
   * 全局异常处理类
   *作用: controller如果要抛出异常,全部都会走到这个类来,后续controller层里面就不用再写try catch
   * 这里的 RestControllerAdvice  + ExceptionHandler 注解可以拦截到异常，
   * 针对不同的异常做不同的拦截，然后做出不同的处理，在controller执行不包异常的时候就会返回正确的结果，
   * 如果出现异常，走GlobalExceptionHandler 异常拦截类进行处理。
 */

/**
 *
 */
@RestControllerAdvice   // 在执行controller方法的前/后执行该代码

/**
 * 处理业务异常的  那么@ExceptionHandler就单独捕获BusinessException这个异常，在返回给前端
 */
public class GlobalExceptionHandler {
    @ExceptionHandler(BusinessException.class)
    public AjaxResult businessExceptionHandler(BusinessException e){
        e.printStackTrace();
        return AjaxResult.me().setSuccess(false).setCode(e.getCode()).setMessage(e.getMessage());
    }

    /**
     * 方法参数异常
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public AjaxResult methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
        e.printStackTrace();
        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
        StringBuffer sb = new StringBuffer();
        for (FieldError fieldError : fieldErrors) {
            sb.append(fieldError.getDefaultMessage());
            sb.append(",");
        }
        String message = sb.substring(0,sb.length()-1);
        return AjaxResult.me().setSuccess(false).setCode(ResponseCode.RESPONSE_CODE_4005.getCode())
                .setMessage(message);
    }

    /**
     *  处理系统异常   捕获系统异常的，所有系统的错误都被这个方法捕获，把错误码封装在返回  相当于捕获所有异常
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public AjaxResult exceptionHandler(Exception e){
        e.printStackTrace();   //不写这个  控制台不会打印异常
        return AjaxResult.me().setSuccess(false).setCode(ResponseCode.RESPONSE_CODE_500.getCode())
                .setMessage("网络异常!请稍后重试!");
    }
}

